package com.iflytek.cosmo.ocr.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipOutputStream;

import com.iflytek.cosmo.ocr.common.PageResult;
import com.iflytek.cosmo.ocr.model.domain.*;
import com.iflytek.cosmo.ocr.model.entity.OcrDirectoryEntity;
import com.iflytek.cosmo.ocr.model.entity.OcrFileEntity;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

/**
 * @ClassName: FileService.java
 * @Description: 文件相关操作
 * @author liangxu5@iflytek.com
 * @version 1.0
 */

public interface FileService {

	/**
	 * @description 上传文件
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月6日下午3:59:52
	 * @version 1.0
	 * @param file file
	 * @return 文件路径
	 * @throws Exception 异常
	 */
	String uploadFile(MultipartFile file) throws Exception;

	/**
	 * 上传文件
	 * 
	 * @param fileName 文件名称
	 * @param fileType 文件类型
	 * @param bytes 文件数据
	 * @return 文件路径
	 * @throws Exception 异常
	 */
	String uploadFile(String fileName, String fileType, byte[] bytes) throws Exception;

	/**
	 * @description 更新或保存文件
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月10日下午2:02:10
	 * @version 1.0
	 * @param fileInfo fileInfo
	 * @return String
	 */
	String saveFileInfo(FileInfo fileInfo);

	/**
	 * @description 获取文件字节流
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月7日下午4:48:48
	 * @version 1.0
	 * @param filePath filePath
	 * @return byte[]
	 */
	byte[] getFileBytes(String filePath);

	/**
	 * @description 查询文件详情
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月7日下午5:39:16
	 * @version 1.0
	 * @param fileId fileId
	 * @return FileInfo
	 */
	FileInfo selectFileInfo(String fileId);

	/**
	 * @description 文件下载接口
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月7日下午7:12:58
	 * @version 1.0
	 * @param fileId fileId
	 * @param response response
	 * @return
	 * @throws IOException 异常
	 */
	void downloadFile(HttpServletResponse response, String fileId, String ip) throws IOException;

	/**
	 * @description 文件重命名
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月10日下午1:08:24
	 * @version 1.0
	 * @param fileInfo fileInfo
	 * @return MessageOutput<Object>
	 */
	MessageOutput<Object> renameFile(FileInfo fileInfo);

	/**
	 * @description 删除文件资料
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月9日下午5:21:07
	 * @version 1.0
	 * @param fileId fileId
	 * @return MessageOutput<Object>
	 */
	MessageOutput<Object> deleteFile(String fileId);

	/**
	 * @description 资料库列表查询
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月10日下午4:03:32
	 * @version 1.0
	 * @param fileInfo 文件信息
	 * @return List<FileInfo>
	 */
	List<OcrFileEntity> getAllFile(FileInfo fileInfo);

	/**
	 * @description 查詢子文件
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月10日下午5:28:08
	 * @version 1.0
	 * @param fileInfo fileInfo
	 * @return List<FileInfo>
	 */
	List<OcrFileEntity> getSubFile(FileInfo fileInfo);

	/**
	 * 新建文件夹
	 * @create 2019年10月15日上午10:47
	 * @param dirName 文件夹名称
	 * @param userId   用户id
	 * @return MessageOutput<Object>
	 */
	OutputMessage<Object> createDirectory(String dirName, String userId);

	/**
	 * 修改文件夹名称
	 * @param dirName 文件夹名称
	 * @param dirId   文件夹id
	 * @return MessageOutput<Object>
	 */
	OutputMessage<Object> modifyDirectory(String dirId, String dirName, String userId);

	/**
	 * 删除文件夹、文件夹下的所有文件、所有识别结果、以及上传到fastdfs上的文件
	 * @param  dirId 文件夹的id
	 */
	OutputMessage<Object> deleteDirectory(String dirId);
	/**
	 * @description 获取所有文件目录
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月12日下午7:07:21
	 * @version 1.0
	 * @return List<OcrDirectoryEntity>
	 */
	List<OcrDirectoryEntity> getAllDirectory();
	
	/**
	 * 按照userId获取目录
	 * <br>
	 * 适用场景:	<br>
	 * 调用方式:	<br>
	 * 业务逻辑说明<br>
	 *
	 * @param userId
	 * @return
	 * @autho dgyu
	 * @time 2019年10月15日 上午10:17:50
	 */
	List<OcrDirectoryEntity> getAllDirectory(String userId,HttpServletRequest request);

	/**
	 * @description 导出图文识别后的文件
	 * @author liangxu5@iflytek.com
	 * @create 2018年9月12日下午8:08:46
	 * @version 1.0
	 * @param response response
	 * @param fieldId 传入参数
	 * @throws IOException 异常
	 */
	void exportFile(HttpServletResponse response, String fieldId) throws IOException;

    /**
     * 批量读取文件流并写入输出流
     *
     * @param fileIds   文件 id
     * @param zippedOut 输出流
     *
     * @return
     */
    Integer writeFilesTo(List<String> fileIds, ZipOutputStream zippedOut);
    /**
     * 批量读取文件流并写入输出流
     * <br>
     * 适用场景:	<br>
     * 调用方式:	<br>
     * 业务逻辑说明<br>
     *
     * @param fileList
     * @param zippedOut
     * @return
     * @autho dgyu
     * @time 2019年10月22日 下午12:57:13
     */
    Integer writeExportFileInfoTo(List<ExportFileInfo> fileList,ZipOutputStream zippedOut);

    /**
     * 按关键词检索文件
     *
     * @param userId  用户 id
     * @param dirId   目录 id
     * @param keyword 关键词
     * @param byName  是否匹配名称
     * @param byText  是否匹配内容
     * @param page    分页页码, 从 1 开始
     * @param size    分页条数
     *
     * @return 分页查询结果
     */
    PageResult<FileInfo> search(String userId, String dirId, String keyword, boolean byName, boolean byText,
            Integer page, Integer size);

    /**
     * 标记文件已打开过
     *
     * @param fileId 文件 id
     *
     * @return 更新成功与否
     */
    boolean markOpened(String fileId);

    /**导出rtf 或html文件
	 * */
	ExportFileHtml exportToHtml(String fileId, String type);
    /**
     * 识别结果导出
     *
     * @param fileId 文件 id
     * @param type   导出文件格式
     *
     * @return
     */
    ExportFileInfo exportToFile(String fileId, String type);

	/**
	 * 检测识别文件
	 *
	 * @param fileId
	 * @return
	 */
	boolean exportCheck(String fileId,String type);
	
	
	/**
	 * 检测识别文件
	 *
	 * @param fileId
	 * @return
	 */
	MessageOutput<?> exportCheckWithMessage(String fileId,String type);
	/**
	 * 查询唯一的文件夹名称
	 * <br>
	 * 适用场景:	<br>
	 * 调用方式:	<br>
	 * 业务逻辑说明<br>
	 *
	 * @param fileIds
	 * @return
	 * @autho dgyu
	 * @time 2019年10月18日 上午10:59:00
	 */
	String queryDistinctDirName(List<String> fileIds);
	/**
	 * 高级功能：图片处理接口（歪斜校正&自动旋转、图像切边）
	 * <br>
	 * 适用场景:	<br>
	 * 调用方式:	<br>
	 * 业务逻辑说明<br>
	 *
	 * @param fileId 文件ID
	 * @param operType 1歪斜校正&自动旋转2图像切边 3分栏切分
	 * @return
	 * @autho dgyu
	 * @time 2019年10月28日 下午5:27:20
	 */
	MessageOutput<Object> correctingPic(@RequestParam String fileId,@RequestParam short operType);
	
	public ExportFileInfo exportToFile(List<String> fileIds, String type);

    /**
     * @param fileId      文件ID
     * @param orientation 文件旋转的角度
     *
     * @return
     */
    OutputMessage<Object> pictureRotate(String fileId, String orientation);

    /**
     * 文件导出
     *
     * @param fileIds      待导出的文件 id 集合
     * @param exportFormat 导出文件格式
     * @param isCompress   是否压缩导出
     * @param userId   用户ID
     *
     * @return 任务 id
     */
    String export(List<String> fileIds, String exportFormat, boolean isCompress,String userId);

	/**
	 * 文件导出任务轮询检查
	 */
	MessageOutput searchTask(List<String> taskList);

    MessageOutput<?> uploadPdfPassword(String fileId, String password, String ip);

    MessageOutput<?> recognizeSubPages(String fileId, List<Integer> pageIndexList);

    MessageOutput<?> queryRecognizeProgress(String fileId);
}
